package xdu.lz.stage1_basic.chapter1_threadsafe.synchronize;

/**
 * 重入锁：
 *1：若m1和m2都非静态 ，t1:m1中调用了m2，此时lock1对象锁this被引用了两次，计数变为2
 当然这不影响t2，因为二者不是同一个锁。但是当二者用的是同一个实例，就得等锁释放。

 2：若m1和m2都是静态，t1和t2用的都是字节码，并不是实例this，需要有一个人释放完锁才行。
 如果重入锁深度比较深，会导致另一个等待时间过长。

 所谓重入，可以从两层来理解。
 1）当前线程在拿了锁A的情况下还可以拿锁B，不同锁的重入。
 2）当前线程拿了锁A的情况下还可以再次拿锁A，一把锁的多次重入。
 *
 */
public class RepeatedLock {
    public static synchronized void m1(){
        System.out.println(Thread.currentThread().getName()+" invoke m1");

        m2();
    }
    public static synchronized void m2(){
        System.out.println(Thread.currentThread().getName()+" invoke m2");
        try {
            Thread.sleep(3000L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        RepeatedLock repeatedLock1 = new RepeatedLock();
        RepeatedLock repeatedLock2 = new RepeatedLock();
        new Thread(()->{
            repeatedLock1.m2();
        }).start();
        new Thread(()->{
            repeatedLock1.m1();
        }).start();

    }
}
